﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DigitalSolutionLibrary.SqlDatabase;
using DigitalSolutionManagement.DatasetSource;
using Microsoft.Reporting.WinForms;
using System.Threading;
using DigitalSolutionLibrary.Utilities;

namespace DigitalSolutionManagement
{
    public partial class frmViewReport : BaseFormNormal
    {
        private DataSet dsCompany;
        private ReportType rptType;
        private Thread th;

        public enum ReportType
        {
            VIEW_EMP,
            VIEW_PRO,
            VIEW_RECEIVING_VOUCHER,
            VIEW_DELIVERY_VOUCHER,
            VIEW_RECEIPT_VOUCHER,
            VIEW_PAYMENT_VOUCHER,
            STOCK_STATISTICS,
            REVENUE,
            PROFIT
        }

        public int ItemId { get; set; }

        public DateTime StartDate { get; set; }

        public DateTime EndDate { get; set; }

        private bool LoadCompanyInfo()
        {
            object obj = Program.dbWrapper.ExecuteStore("LoadComInfo", null, DatabaseWrapper.ReturnType.DATASET);
            if (obj != null)
            {
                dsCompany = (DataSet)obj;
                return true;
            }
            return false;
        }

        #region load emp info
        private void GenEmpReport()
        {
            if (LoadCompanyInfo())
            {
                ParameterStock stock = new ParameterStock();
                Parameter par = new Parameter("empId", ItemId, SqlDbType.Int);
                stock.AddParamter(par);
                object obj = Program.dbWrapper.ExecuteStore("GetEmployee", stock, DatabaseWrapper.ReturnType.DATASET);
                if (obj != null)
                {
                    DataSet dsEmployee = (DataSet)obj;
                    ReportDataSource[] rds = new ReportDataSource[] { new ReportDataSource("DataSet1", dsCompany.Tables["Table"]),
                        new ReportDataSource("DataSet2", dsEmployee.Tables["Table"])};
                    
                    ShowReport("rptEmployee.rdlc", rds,null);
                    processing1.HideProcessing();
                }
                else
                {
                    processing1.HideProcessing();
                    MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else
            {
                processing1.HideProcessing();
                MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        #endregion

        #region load product info
        private void GenProReport()
        {
            if (LoadCompanyInfo())
            {
                ParameterStock stock = new ParameterStock();
                Parameter par = new Parameter("ProId", ItemId, SqlDbType.Int);
                stock.AddParamter(par);
                object obj = Program.dbWrapper.ExecuteStore("GetProduct", stock, DatabaseWrapper.ReturnType.DATASET);
                if (obj != null)
                {
                    DataSet dsProduct = (DataSet)obj;
                    ReportDataSource[] rds = new ReportDataSource[] { new ReportDataSource("DataSet1", dsCompany.Tables["Table"]),
                        new ReportDataSource("DataSet2", dsProduct.Tables["Table"])};

                    ShowReport("rptProduct.rdlc", rds, null);
                    processing1.HideProcessing();
                }
                else
                {
                    processing1.HideProcessing();
                    MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else
            {
                processing1.HideProcessing();
                MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        #endregion

        #region load receiving voucher data
        private void GenReceivingVoucherReport()
        {
            if (LoadCompanyInfo())
            {
                ParameterStock stock = new ParameterStock();
                Parameter par = new Parameter("No", ItemId, SqlDbType.Int);
                stock.AddParamter(par);
                object obj = Program.dbWrapper.ExecuteStore("GetReceivingVoucher", stock, DatabaseWrapper.ReturnType.DATASET);
                if (obj != null)
                {
                    DataSet ds = (DataSet)obj;
                    ReportDataSource[] rds = new ReportDataSource[] { new ReportDataSource("DataSet1", dsCompany.Tables["Table"]),
                        new ReportDataSource("DataSet2", ds.Tables["Table"]), new ReportDataSource("DataSet3", ds.Tables["Table1"])};

                    string textMoney = Utility.ReadMoney((long)Convert.ToInt64(ds.Tables[0].Rows[0]["TotalMoney"]));
                    ReportParameter[] rptParam = new ReportParameter[1];
                    rptParam[0] = new ReportParameter("ParTextMoney", textMoney);

                    ShowReport("rptReceivingVoucher.rdlc", rds, rptParam);
                    processing1.HideProcessing();
                }
                else
                {
                    processing1.HideProcessing();
                    MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else
            {
                processing1.HideProcessing();
                MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        #endregion

        #region load delivvery voucher data
        private void GenDeliveryVoucherReport()
        {
            if (LoadCompanyInfo())
            {
                ParameterStock stock = new ParameterStock();
                Parameter par = new Parameter("No", ItemId, SqlDbType.Int);
                stock.AddParamter(par);
                object obj = Program.dbWrapper.ExecuteStore("GetDeliveryVoucher", stock, DatabaseWrapper.ReturnType.DATASET);
                if (obj != null)
                {
                    DataSet ds = (DataSet)obj;
                    ReportDataSource[] rds = new ReportDataSource[] { new ReportDataSource("DataSet1", dsCompany.Tables["Table"]),
                        new ReportDataSource("DataSet2", ds.Tables["Table"]), new ReportDataSource("DataSet3", ds.Tables["Table1"])};

                    string textMoney = Utility.ReadMoney((long)Convert.ToInt64(ds.Tables[0].Rows[0]["TotalMoney"]));
                    ReportParameter[] rptParam = new ReportParameter[1];
                    rptParam[0] = new ReportParameter("ParTextMoney", textMoney);

                    ShowReport("rptDeliveryVoucher.rdlc", rds, rptParam);
                    processing1.HideProcessing();
                }
                else
                {
                    processing1.HideProcessing();
                    MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else
            {
                processing1.HideProcessing();
                MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        #endregion

        #region load receipt voucher data
        private void GenReceiptVoucherReport()
        {
            if (LoadCompanyInfo())
            {
                ParameterStock stock = new ParameterStock();
                Parameter par = new Parameter("No", ItemId, SqlDbType.Int);
                stock.AddParamter(par);
                object obj = Program.dbWrapper.ExecuteStore("GetReceiptVoucher", stock, DatabaseWrapper.ReturnType.DATASET);
                if (obj != null)
                {
                    DataSet ds = (DataSet)obj;
                    ReportDataSource[] rds = new ReportDataSource[] { new ReportDataSource("DataSet1", dsCompany.Tables["Table"]),
                        new ReportDataSource("DataSet2", ds.Tables["Table"])};

                    string textMoney = Utility.ReadMoney((long)Convert.ToInt64(ds.Tables[0].Rows[0]["Money"]));
                    ReportParameter[] rptParam = new ReportParameter[1];
                    rptParam[0] = new ReportParameter("ParTextMoney", textMoney);

                    ShowReport("rptReceiptVoucher.rdlc", rds, rptParam);
                    processing1.HideProcessing();
                }
                else
                {
                    processing1.HideProcessing();
                    MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else
            {
                processing1.HideProcessing();
                MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        #endregion

        #region load receipt voucher data
        private void GenPaymentVoucherReport()
        {
            if (LoadCompanyInfo())
            {
                ParameterStock stock = new ParameterStock();
                Parameter par = new Parameter("No", ItemId, SqlDbType.Int);
                stock.AddParamter(par);
                object obj = Program.dbWrapper.ExecuteStore("GetPaymentVoucher", stock, DatabaseWrapper.ReturnType.DATASET);
                if (obj != null)
                {
                    DataSet ds = (DataSet)obj;
                    ReportDataSource[] rds = new ReportDataSource[] { new ReportDataSource("DataSet1", dsCompany.Tables["Table"]),
                        new ReportDataSource("DataSet2", ds.Tables["Table"])};

                    string textMoney = Utility.ReadMoney((long)Convert.ToInt64(ds.Tables[0].Rows[0]["Money"]));
                    ReportParameter[] rptParam = new ReportParameter[1];
                    rptParam[0] = new ReportParameter("ParTextMoney", textMoney);

                    ShowReport("rptPaymentVoucher.rdlc", rds, rptParam);
                    processing1.HideProcessing();
                }
                else
                {
                    processing1.HideProcessing();
                    MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else
            {
                processing1.HideProcessing();
                MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        #endregion

        #region load stock data
        private void GenStockStatisticsReport()
        {
            if (LoadCompanyInfo())
            {
                object obj = Program.dbWrapper.ExecuteStore("StockStatistics", null, DatabaseWrapper.ReturnType.DATASET);
                if (obj != null)
                {
                    DataSet ds = (DataSet)obj;
                    ReportDataSource[] rds = new ReportDataSource[] { new ReportDataSource("DataSet1", dsCompany.Tables["Table"]),
                        new ReportDataSource("DataSet2", ds.Tables["Table"])};

                    ShowReport("rptStockStatistics.rdlc", rds, null);
                    processing1.HideProcessing();
                }
                else
                {
                    processing1.HideProcessing();
                    MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else
            {
                processing1.HideProcessing();
                MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        #endregion

        #region load revenue data
        private void GenRevenuetatisticsReport()
        {
            if (LoadCompanyInfo())
            {
                ParameterStock stock = new ParameterStock();
                Parameter par = new Parameter("StartDate", StartDate, SqlDbType.Date);
                stock.AddParamter(par);

                par = new Parameter("EndDate", EndDate, SqlDbType.Date);
                stock.AddParamter(par);

                object obj = Program.dbWrapper.ExecuteStore("RevenueStatistics", stock, DatabaseWrapper.ReturnType.DATASET);
                if (obj != null)
                {
                    DataSet ds = (DataSet)obj;
                    ReportDataSource[] rds = new ReportDataSource[] { new ReportDataSource("DataSet1", dsCompany.Tables["Table"]),
                        new ReportDataSource("DataSet2", ds.Tables["Table"]), new ReportDataSource("DataSet3", ds.Tables["Table1"]),
                        new ReportDataSource("DataSet4", ds.Tables["Table2"])};

                    string textDate = "Từ ngày " + StartDate.ToShortDateString() + " - Đến ngày " + EndDate.ToShortDateString();
                    ReportParameter[] rptParam = new ReportParameter[1];
                    rptParam[0] = new ReportParameter("ParamDate", textDate);

                    ShowReport("rptRevenueStatistics.rdlc", rds, rptParam);
                    processing1.HideProcessing();
                }
                else
                {
                    processing1.HideProcessing();
                    MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else
            {
                processing1.HideProcessing();
                MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        #endregion

        #region load profit data
        private void GenProfitStatisticsReport()
        {
            if (LoadCompanyInfo())
            {
                ParameterStock stock = new ParameterStock();
                Parameter par = new Parameter("StartDate", StartDate, SqlDbType.Date);
                stock.AddParamter(par);

                par = new Parameter("EndDate", EndDate, SqlDbType.Date);
                stock.AddParamter(par);

                object obj = Program.dbWrapper.ExecuteStore("ProfitStatistics", stock, DatabaseWrapper.ReturnType.DATASET);
                if (obj != null)
                {
                    DataSet ds = (DataSet)obj;
                    ReportDataSource[] rds = new ReportDataSource[] { new ReportDataSource("DataSet1", dsCompany.Tables["Table"]),
                        new ReportDataSource("DataSet2", ds.Tables["Table"]), new ReportDataSource("DataSet3", ds.Tables["Table1"]),
                        new ReportDataSource("DataSet4", ds.Tables["Table2"]), new ReportDataSource("DataSet5", ds.Tables["Table3"]),
                        new ReportDataSource("DataSet6", ds.Tables["Table4"])};

                    string textDate = "Từ ngày " + StartDate.ToShortDateString() + " - Đến ngày " + EndDate.ToShortDateString();
                    ReportParameter[] rptParam = new ReportParameter[1];
                    rptParam[0] = new ReportParameter("ParamDate", textDate);

                    ShowReport("rptProfitStatistics.rdlc", rds, rptParam);
                    processing1.HideProcessing();
                }
                else
                {
                    processing1.HideProcessing();
                    MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            else
            {
                processing1.HideProcessing();
                MessageBox.Show("Không thể kết nối đến server, vui lòng thử lại sau", "DSCo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        #endregion

        public frmViewReport(ReportType type)
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            rptType = type;
        }

        private void ShowReport(string rptName, ReportDataSource[] rptDataSource, ReportParameter[] parameter)
        {
            //reportViewer1.LocalReport.ReportPath = rptSourcePath + rptName;
            reportViewer1.LocalReport.ReportEmbeddedResource = "DigitalSolutionManagement.ReportSource." + rptName;
            reportViewer1.LocalReport.DataSources.Clear();

            if (parameter != null)
                reportViewer1.LocalReport.SetParameters(parameter);

            foreach (ReportDataSource ds in rptDataSource)
                reportViewer1.LocalReport.DataSources.Add(ds);
            reportViewer1.RefreshReport();
        }

        private void frmViewReport_Load(object sender, EventArgs e)
        {
            switch (rptType)
            {
                case ReportType.VIEW_EMP:
                    this.Text = "Thông tin nhân viên";
                    processing1.ShowProcessing();
                    th = new Thread(() => GenEmpReport());
                    th.Start();
                    break;
                case ReportType.VIEW_PRO:
                    this.Text = "Thông tin sản phẩm";
                    processing1.ShowProcessing();
                    th = new Thread(() => GenProReport());
                    th.Start();
                    break;
                case ReportType.VIEW_RECEIVING_VOUCHER:
                    this.Text = "Thông tin phiếu nhập kho";
                    processing1.ShowProcessing();
                    th = new Thread(() => GenReceivingVoucherReport());
                    th.Start();
                    break;
                case ReportType.VIEW_DELIVERY_VOUCHER:
                    this.Text = "Thông tin phiếu xuất kho";
                    processing1.ShowProcessing();
                    th = new Thread(() => GenDeliveryVoucherReport());
                    th.Start();
                    break;
                case ReportType.VIEW_RECEIPT_VOUCHER:
                    this.Text = "Thông tin phiếu thu";
                    processing1.ShowProcessing();
                    th = new Thread(() => GenReceiptVoucherReport());
                    th.Start();
                    break;
                case ReportType.VIEW_PAYMENT_VOUCHER:
                    this.Text = "Thông tin phiếu chi";
                    processing1.ShowProcessing();
                    th = new Thread(() => GenPaymentVoucherReport());
                    th.Start();
                    break;
                case ReportType.STOCK_STATISTICS:
                    this.Text = "Thống kê kho";
                    processing1.ShowProcessing();
                    th = new Thread(() => GenStockStatisticsReport());
                    th.Start();
                    break;
                case ReportType.REVENUE:
                    this.Text = "Thống kê doanh thu";
                    processing1.ShowProcessing();
                    th = new Thread(() => GenRevenuetatisticsReport());
                    th.Start();
                    break;
                case ReportType.PROFIT:
                    this.Text = "Thống kê lợi nhuận";
                    processing1.ShowProcessing();
                    th = new Thread(() => GenProfitStatisticsReport());
                    th.Start();
                    break;
            }
        }
    }
}
